#include "USART0.h"

UART_TypeDef Usart0 = {{0}, 0 ,0};//初始化结构体
// USART0 初始化 (TX: PA3, RX: PA2)
void USART0_Init(void)
{
    // 1. 开启时钟
    CKCU_PeripClockConfig_TypeDef CCLOCK = {{0}};
    CCLOCK.Bit.AFIO = 1;
    CCLOCK.Bit.USART0 = 1;
    CCLOCK.Bit.PA = 1;
    CKCU_PeripClockConfig(CCLOCK, ENABLE);

    // 2. 配置 GPIO (PA3-TX, PA2-RX)
    GPIO_PullResistorConfig(HT_GPIOA, USART0_RX_GPIO_PIN, GPIO_PR_UP); // RX 上拉
    AFIO_GPxConfig(USART0_TX_GPIO_ID, USART0_TX_AFIO_PIN, AFIO_FUN_USART_UART);
    AFIO_GPxConfig(USART0_RX_GPIO_ID, USART0_RX_AFIO_PIN, AFIO_FUN_USART_UART);

    // 3. 配置 USART0 参数
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_WordLength = USART_WORDLENGTH_8B;
    USART_InitStruct.USART_StopBits = USART_STOPBITS_1;
    USART_InitStruct.USART_Parity = USART_PARITY_NO;
    USART_InitStruct.USART_Mode = USART_MODE_NORMAL;
    USART_Init(USART0_PORT, &USART_InitStruct);

    // 4. 使能中断
    USART_IntConfig(USART0_PORT, USART_INT_RXDR, ENABLE);
    USART_RXTLConfig(USART0_PORT, USART_RXTL_04); // 接收中断优先级
    NVIC_EnableIRQ(USART0_IRQn); // 使能 USART0 中断

    // 5. 使能收发
    USART_TxCmd(USART0_PORT, ENABLE);
    USART_RxCmd(USART0_PORT, ENABLE);
}


// 发送单字节
void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(HT_USART0, Byte);
    while (USART_GetFlagStatus(HT_USART0, USART_FLAG_TXDE) == RESET); // 等待发送完成
}

// 发送字符串
void Serial_SendString(char *String)
{
    uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)//遍历字符数组（字符串），遇到字符串结束标志位后停止
	{
		Serial_SendByte(String[i]);		//依次调用Serial_SendByte发送每个字节数据
	}
}

